package net.fe.network;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSpinner;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SpinnerNumberModel;
import net.fe.Player;
import net.fe.Session;
import net.fe.lobbystage.LobbyStage;
import net.fe.modifier.DivineIntervention;
import net.fe.modifier.MadeInChina;
import net.fe.modifier.Modifier;
import net.fe.modifier.SuddenDeath;
import net.fe.modifier.Treasury;
import net.fe.modifier.Vegas;
import net.fe.modifier.Veterans;
import net.fe.overworldStage.objective.Objective;
import net.fe.overworldStage.objective.Rout;
import net.fe.overworldStage.objective.Seize;
import net.fe.pick.AllPick;
import net.fe.pick.Draft;
import net.fe.pick.PickMode;
import net.fe.unit.Unit;
import net.fe.unit.UnitIdentifier;
import chu.engine.Game;
import chu.engine.Stage;
/**
* A game that does not render anything. Manages logic only
* @author Shawn
*
*/
public class FEServer extends Game {
private static Server server;
private static Stage currentStage;
public static LobbyStage lobby;
private static Map<String, Objective[]> maps;
public static void main(String[] args) {
final JFrame frame = new JFrame("FEServer");
Rout rout = new Rout();
Seize seize = new Seize();
maps = new HashMap<String, Objective[]>();
maps.put("town", new Objective[]{rout});
maps.put("plains", new Objective[]{rout, seize});
maps.put("fort", new Objective[]{rout, seize});
maps.put("decay", new Objective[]{rout, seize});
frame.getContentPane().setLayout(new BorderLayout(0, 0));
DefaultListModel sModel = new DefaultListModel();
// Modifiers
DefaultListModel model = new DefaultListModel();
model.addElement(new MadeInChina());
model.addElement(new Treasury());
model.addElement(new Veterans());
model.addElement(new DivineIntervention());
model.addElement(new SuddenDeath());
model.addElement(new Vegas());
final JPanel mainPanel = new JPanel();
frame.getContentPane().add(mainPanel, BorderLayout.CENTER);
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
JPanel mapPanel = new JPanel();
mainPanel.add(mapPanel);
mapPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
JLabel mapNameLabel = new JLabel("Map: ");
mapPanel.add(mapNameLabel);
JPanel objectivePanel = new JPanel();
mainPanel.add(objectivePanel);
JLabel objLabel = new JLabel("Objective: ");
objectivePanel.add(objLabel);
final JComboBox objComboBox = new JComboBox();
objectivePanel.add(objComboBox);
// populate list of maps
final JComboBox mapSelectionBox = new JComboBox();
mapSelectionBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
objComboBox.setModel(new DefaultComboBoxModel(maps.get(mapSelectionBox.getSelectedItem())));
}
});
mapPanel.add(mapSelectionBox);
mapSelectionBox.setModel(new DefaultComboBoxModel(maps.keySet().toArray()));
JLabel label = new JLabel("Max units: ");
mapPanel.add(label);
final JSpinner maxUnitsSpinner = new JSpinner();
mapPanel.add(maxUnitsSpinner);
maxUnitsSpinner.setModel(new SpinnerNumberModel(8, 1, 8, 1));
// Objectives
ComboBoxModel oModel = new DefaultComboBoxModel(maps.get(mapSelectionBox.getSelectedItem()));
objComboBox.setModel(oModel);
JLabel lblPickMode = new JLabel("Pick mode: ");
objectivePanel.add(lblPickMode);
// Pick modes
ComboBoxModel pModel = new DefaultComboBoxModel(new PickMode[] {new Draft(), new AllPick()});
final JComboBox pickModeBox = new JComboBox();
pickModeBox.setModel(pModel);
objectivePanel.add(pickModeBox);
JSeparator separator = new JSeparator();
mainPanel.add(separator);
JLabel modifiersLabel = new JLabel("Modifiers");
modifiersLabel.setAlignmentX(Component.CENTER_ALIGNMENT);
mainPanel.add(modifiersLabel);
JPanel modifiersPane = new JPanel();
mainPanel.add(modifiersPane);
modifiersPane.setLayout(new BoxLayout(modifiersPane, BoxLayout.X_AXIS));
JScrollPane selectedModifiersScrollPane = new JScrollPane();
selectedModifiersScrollPane.setPreferredSize(new Dimension(120,150));
modifiersPane.add(selectedModifiersScrollPane);
JScrollPane modifiersScrollPane = new JScrollPane();
modifiersScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
modifiersScrollPane.setPreferredSize(new Dimension(120,150));
final ModifierList modifiersList = new ModifierList();
modifiersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
modifiersScrollPane.add(modifiersList);
modifiersList.setModel(model);
modifiersScrollPane.setViewportView(modifiersList);
final ModifierList selectedModifiersList = new ModifierList();
selectedModifiersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
selectedModifiersScrollPane.add(selectedModifiersList);
selectedModifiersList.setModel(sModel);
selectedModifiersScrollPane.setViewportView(selectedModifiersList);
JPanel buttonsPanel = new JPanel();
modifiersPane.add(buttonsPanel);
JButton addModifierBtn = new JButton("<-- Add");
addModifierBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
int index = modifiersList.getSelectedIndex();
if(index != -1) {
Object o = modifiersList.getModel().getElementAt(index);
((DefaultListModel)modifiersList.getModel()).remove(modifiersList.getSelectedIndex());
((DefaultListModel)selectedModifiersList.getModel()).add(0,o);
}
}
});
buttonsPanel.setLayout(new GridLayout(0, 1, 0, 0));
buttonsPanel.add(addModifierBtn);
JButton removeModifierBtn = new JButton("Remove -->");
removeModifierBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int index = selectedModifiersList.getSelectedIndex();
if(index != -1) {
Object o = selectedModifiersList.getModel().getElementAt(index);
((DefaultListModel)selectedModifiersList.getModel()).remove(selectedModifiersList.getSelectedIndex());
((DefaultListModel)modifiersList.getModel()).add(0,o);
}
}
});
buttonsPanel.add(removeModifierBtn);
modifiersPane.add(modifiersScrollPane);
Component verticalStrut = Box.createVerticalStrut(20);
mainPanel.add(verticalStrut);
final JButton startServer = new JButton("Start server");
startServer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
frame.getContentPane().add(new JLabel("Server IP: " + InetAddress.getLocalHost().getHostAddress()){
private static final long serialVersionUID = 1L;
{
this.setFont(getFont().deriveFont(20f));
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
}}, BorderLayout.NORTH);
frame.remove(mainPanel);
frame.remove(startServer);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
frame.pack();
Thread serverThread = new Thread() {
public void run() {
FEServer feserver = new FEServer();
try{
Session s = FEServer.getServer().getSession();
s.setMaxUnits((Integer)maxUnitsSpinner.getValue());
for(int i=0; i< selectedModifiersList.getModel().getSize(); i++) {
Modifier m = (Modifier) selectedModifiersList.getModel().getElementAt(i);
s.addModifier(m);
}
s.setMap((String)mapSelectionBox.getSelectedItem());
s.setObjective((Objective)objComboBox.getSelectedItem());
s.setPickMode((PickMode)pickModeBox.getSelectedItem());
feserver.init();
feserver.loop();
} catch (Exception e){
System.err.println("Exception occurred, writing to logs...");
e.printStackTrace();
try{
File errLog = new File("error_log_server" + System.currentTimeMillis()%100000000 + ".log");
PrintWriter pw = new PrintWriter(errLog);
e.printStackTrace(pw);
pw.close();
}catch (IOException e2){
e2.printStackTrace();
}
System.exit(0);
}
}
};
serverThread.start();
}
});
frame.getContentPane().add(startServer, BorderLayout.SOUTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
protected Session getSession() {
// TODO Auto-generated method stub
return null;
}
public FEServer() {
server = new Server();
}
public void init() {
messages = new CopyOnWriteArrayList<Message>();
Thread serverThread = new Thread() {
public void run() {
server.start(21255);
}
};
lobby = new LobbyStage(server.getSession());
currentStage = lobby;
serverThread.start();
}
public static Unit getUnit(UnitIdentifier id){
for(Player p: getPlayers().values()){
if(!p.isSpectator() && p.getParty().getColor().equals(id.partyColor)){
return p.getParty().search(id.name);
}
}
return null;
}
@Override
public void loop() {
boolean yes = true;
while(yes) {
time = System.nanoTime();
messages.clear();
messages.addAll(server.messages);
for(Message m : messages)
server.messages.remove(m);
currentStage.beginStep();
currentStage.onStep();
currentStage.endStep();
timeDelta = System.nanoTime()-time;
}
}
public static Stage getCurrentStage() {
return currentStage;
}
public static void setCurrentStage(Stage stage) {
currentStage = stage;
}
public static Server getServer() {
return server;
}
public static HashMap<Byte, Player> getPlayers() {
return server.getSession().getPlayerMap();
}
public static void resetToLobby() {
for(Player p : getPlayers().values()) {
p.ready = false;
}
FEServer.getServer().allowConnections = false;
currentStage = lobby;
}
public static void log(String s){
server.log.log(s);
}
}
class ModifierList extends JList {
private static final long serialVersionUID = 561574462354745569L;
public String getToolTipText(MouseEvent event) {
Point p = event.getPoint();
int index = locationToIndex(p);
String tip = ((Modifier) getModel().getElementAt(index)).getDescription();
return tip;
}
}